Skip to content

Unique Constraint VS Unique Index

TLDR

  • Unique Constraint 與 Unique Index 在資料唯一性驗證與查詢效能上功能完全相同。
  • 建立 Unique Constraint 時,SQL Server 會自動在背景建立一個對應的 Unique Index。
  • 兩者主要差異在於「語意」:Unique Constraint 強調資料完整性(Data Integrity),而 Unique Index 強調查詢效能。
  • 建議優先使用 Unique Constraint,因為它能讓資料庫的設計意圖更明確。
  • Foreign Key 關聯的目標欄位必須具備唯一性,無論是透過 Constraint 還是 Index 達成皆可。

命名規範與技術背景

在 SQL Server 中,為了維護資料庫結構的清晰度,建議遵循以下命名慣例:

  • Primary Key:PK_TableName
  • Clustered Index:CX_TableName_Column1_Column2
  • Non-Clustered Index:IX_TableName_Column1_Column2
  • Unique Index (Alternate Key):AK_TableName_Column1_Column2
  • Unique Constraint:UQ_TableName_Column1_Column2
  • Check Constraint:CK_TableName_Column1_Column2
  • Default Constraint:DF_TableName_Column1_Column2
  • Foreign Key:FK_TableName1_Column1_Column2_TableName2

Unique Constraint 與 Unique Index 的差異

什麼情況下會遇到這個問題

當開發者在設計資料表結構時,面臨「該使用 Unique Constraint 還是 Unique Index 來確保欄位唯一性」的選擇困難時。

原因分析

從 SQL Server 的執行層面來看,兩者並無明顯差異。資料驗證機制相同,且查詢最佳化工具(Query Optimizer)不會區分該索引是由 Constraint 建立還是手動建立。

主要的差異在於語意明確性

  • Unique Constraint:屬於資料完整性的一部分,明確表達該欄位在業務邏輯上必須是唯一的。
  • Unique Index:屬於效能調校的一部分,主要目的是為了加速查詢,同時具備強制唯一性的副作用。

驗證結果

在 Foreign Key 的關聯上,無論目標欄位是透過 Unique Constraint 還是 Unique Index 建立,SQL Server 均能正確識別並建立關聯。

sql
-- 建立包含 Unique Constraint 的資料表
CREATE TABLE [dbo].[Main](
 [Id] [uniqueidentifier] NOT NULL,
 [SeqNo] [bigint] IDENTITY(1,1) NOT NULL,
 [UQ] [bigint] NULL,
 [AK] [bigint] NULL,
    CONSTRAINT [PK_Main] PRIMARY KEY NONCLUSTERED ([Id] ASC),
    CONSTRAINT [UQ_Main] UNIQUE NONCLUSTERED ([UQ] ASC)
) ON [PRIMARY]
GO

-- 建立關聯的 Foreign Key
ALTER TABLE [dbo].[Ref] ADD CONSTRAINT [FK_Ref_Main_UQ] FOREIGN KEY([RefUQ])
REFERENCES [dbo].[Main] ([UQ])
GO

建立方式與管理

使用 SQL 建立

若需透過指令建立,可參考以下語法:

sql
-- 建立 Unique Constraint
ALTER TABLE {TableName} ADD CONSTRAINT {IndexName} UNIQUE ({ColumnName});

-- 建立 Unique Index
CREATE UNIQUE INDEX {IndexName} ON {TableName} ({ColumnName});

使用 SSMS 建立

在 SQL Server Management Studio (SSMS) 中,兩者的管理位置不同:

  • Unique Constraint:位於資料表設計介面的「索引/索引鍵」中,型別選「唯一索引鍵」。
  • Unique Index:若透過資料表設計介面,型別選「索引」並將「是唯一」設為「是」;或直接在「索引」資料夾中新增。

TIP

若開啟了資料表設計視窗,該資料表的「新增索引」選項會呈現反灰,此時應透過設計視窗內的「索引/索引鍵」進行管理。

SSMS 顯示差異

  • 「索引鍵」資料夾:顯示 Primary Key、Unique Constraint 與 Foreign Key。
  • 「索引」資料夾:顯示除了 Foreign Key 以外的所有索引。

異動歷程

    • 初版文件建立。